﻿using System;
using System.Collections;

namespace 序列化工具
{
    /// <summary>
    /// 用于存储序列化与反序列化工具支持的类型，并提供判断方法
    /// </summary>
    public static class 类型判断器
    {
        /// <summary>
        /// 返回一个支持的类型
        /// </summary>
        public enum 类型
        {
            int数字,
            float数字,
            double数字,
            decimal数字,
            long数字,
            bool值,
            字符串,
            类,       //已弃用
            基本类型,
            列表,
            字典,
            未知
        }

        /// <summary>
        /// 通过实例判断支持的类型
        /// </summary>
        /// <param name="实例"></param>
        /// <returns></returns>
        public static 类型 基础类型判断(object 实例)
        {
            var 成员类型 = 实例.GetType();
            if (成员类型 == typeof(int)) { return 类型.int数字; }
            if (成员类型 == typeof(double)) { return 类型.double数字; }
            if (成员类型 == typeof(decimal)) { return 类型.decimal数字; }
            if (成员类型 == typeof(float)) { return 类型.float数字; }
            if (成员类型 == typeof(string)) { return 类型.字符串; }
            if (成员类型 == typeof(bool)) { return 类型.bool值; }
            if (成员类型 == typeof(long)) { return 类型.long数字; }
            if (typeof(IList).IsAssignableFrom(成员类型)) { return 类型.列表; }
            if (typeof(IDictionary).IsAssignableFrom(成员类型)) { return 类型.字典; }
            return 类型.未知;
        }
        /// <summary>
        /// 通过Type判断支持的类型
        /// </summary>
        /// <param name="成员类型"></param>
        /// <returns></returns>
        public static 类型 基础类型判断(Type 成员类型)
        {
            if (成员类型 == typeof(int)) { return 类型.int数字; }
            if (成员类型 == typeof(double)) { return 类型.double数字; }
            if (成员类型 == typeof(decimal)) { return 类型.decimal数字; }
            if (成员类型 == typeof(float)) { return 类型.float数字; }
            if (成员类型 == typeof(string)) { return 类型.字符串; }
            if (成员类型 == typeof(bool)) { return 类型.bool值; }
            if (成员类型 == typeof(long)) { return 类型.long数字; }
            if (typeof(IList).IsAssignableFrom(成员类型)) { return 类型.列表; }
            if (typeof(IDictionary).IsAssignableFrom(成员类型)) { return 类型.字典; }
            return 类型.未知;
        }
    }
}
